package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author: 放学后海堤日记
 * @Date: 2023/4/10 17:20
 * @Desc:
 */
//@Aspect
//@Component
//@Slf4j
public class ServiceAop {
    //当切点表达式重复时，可将其抽取到一个切点方法上，其他切点使用该表达式只需引用方法即可
    //其他AOP类也可以使用该切点表达式，不过要通过方法的全包名引用，如：com.itheima.utils.aop.ServiceAop.around()
//    @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
    public void around(){}
//    @Around("execution(* com.itheima.service.*.*(..))")
//    @Around("around()")//通过切点方法引用切点表达式
//    @Around("@annotation(com.itheima.annotion.MyAnnotion)")//@annotation参数是自定义注解的全包名，将被该自定义注解修饰的方法标记为切入点
    public Object excutionTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        //获取切入点方法执行后的返回值
        Object result = proceedingJoinPoint.proceed();
        //获取切入点所在类的类名
        String className = proceedingJoinPoint.getTarget().getClass().getName();
        //获取切入点的方法名
        String methodName = proceedingJoinPoint.getSignature().getName();
        //获取接切入点方法传入的参数
        Object[] args = proceedingJoinPoint.getArgs();

//        log.info("\n=====================================================================================");
//        log.info(proceedingJoinPoint.getSignature().toString() + "操作执行用时：" + (System.currentTimeMillis() - start));
//        log.info("=====================================================================================\n");
        return result;
    }

//    @Before("around()")
    public void beforre(JoinPoint joinPoint) {
        //获取接切入点所在类类名
        String className = joinPoint.getTarget().getClass().getName();
        //获取切入点的方法名
        String methoodName = joinPoint.getSignature().getName();
        //获取切入点的参数
        Object[] args = joinPoint.getArgs();
    }
}
